package com.io.controller;

import com.io.client.ProductClient;
import com.io.dto.ProductReq;
import com.io.dto.ProductRes;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

/**
 * The class/interface
 *
 * @author guodd
 * @version 1.0 use jdk 1.8
 */
@RestController
@Slf4j
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private RestTemplate newRestTemplate;

    @Autowired
    private ProductClient productClient;

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    /**
     * 方式一：普通restTemplate
     * 1、一旦服务提供者的地址发生变化，我们就要去修改服务调用者的地址
     * 2、一旦服务提供者做了集群，服务无法实现负载均衡的效果
     * 3、一旦服务变得越来越多，如何管理服务清单（IP + Port）
     */
    @PostMapping(value = "/old/info")
    public ProductRes getInfoOld(@RequestBody ProductReq productReqDTO) {
        return restTemplate.postForObject("http://127.0.0.1:8070/product/info", productReqDTO, ProductRes.class);
    }

    /**
     * 方式二：负载restTemplate
     */
    @PostMapping(value = "/new/info")
    public ProductRes getInfoNew(@RequestBody ProductReq productReqDTO) {
        return newRestTemplate.postForObject("http://lily-base-product/product/info", productReqDTO, ProductRes.class);
    }

    /**
     * 方式三：feign，更方便，像使用本地方法一样进行服务方法的调用
     */
    @PostMapping(value = "/feign/info")
    public ProductRes getInfoFeign(@RequestBody ProductReq productReqDTO) {
        rocketMQTemplate.convertAndSend("base-order", productReqDTO);
        return productClient.getInfo(productReqDTO);
    }
}
